package medOffice.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import medOffice.PlanoDeSaude;

/**
 * Classe que inicializa o banco de dados de um plano de saude.
 * @author Tiago Leite - tiagohsl@lcc.ufcg.edu.br
 * @version 1.0 </br> 02/12/09
 *
 */
public class PlanoDAO {
	protected Connection conexao;
	
	
	/**
	 * Construtor default da classe.
	 */
	public PlanoDAO(){
		conexao = ConnectionFactory.getConnection();
		procedimento();
	}
	
	/**
	 * Construtor da classe
	 * @param Connection conexao
	 */
	public PlanoDAO(Connection conexao){
		this.conexao = conexao;
		procedimento();
	}
	
	/**
	 * Metodo que cria a tabela caso nao exista
	 * e realiza a connexao com o BD
	 */
	private void procedimento(){
				
		PreparedStatement stmt;
		
		String sql = 
			"create table if not exists PlanoDeSaude(codigoPlano integer primary key, nomePlano varchar(50)," + 
			"telefonePlano varchar(25), valorRetorno double, valorConsulta double)";

		try {
			stmt = conexao.prepareStatement(sql);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}
	
	/**
	 * Metodo que inicializa um plano no banco de dados.
	 * @param PlanoDeSaude plano 
	 * @throws SQLException
	 */
	public void create(PlanoDeSaude plano) throws SQLException {
		String sql = "insert into PlanoDeSaude(codigoPlano, nomePlano," +
				" telefonePlano, valorRetorno, valorConsulta) values (?,?,?,?,?)";

		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setInt(1, plano.getCodigo());
		stmt.setString(2, plano.getNomeDoPlano());
		stmt.setString(3, plano.getTelefoneContato());
		stmt.setDouble(4, plano.getValorRetorno());
		stmt.setDouble(5, plano.getValorConsulta());
		
		stmt.execute();
		stmt.close();
	}
	
	/**
	 * Metodo que fecha uma conexao com o banco de dados.
	 * @throws Exception
	 */
	public void closeConnection() throws Exception{
		conexao.close();
	}
	
	/**
	 * Metodo que recupera os dados de todos os Planos de Saude
	 * imprimindo os mesmos na tela.
	 * @throws SQLException
	 */
	public void recuperaDadosPlano() throws SQLException {
		
		PreparedStatement stmt = conexao.prepareStatement("select * from PlanoDeSaude");

		ResultSet rs = stmt.executeQuery();	
		
		for(PlanoDeSaude plano: convertePesquisaEmLista(rs)){
		
			System.out.println("Codigo: " + plano.getCodigo() + " | Nome: " + plano.getNomeDoPlano() + 
					" | Telefone: " + plano.getTelefoneContato() + " | valorRetorno: " + 
					plano.getValorRetorno() + " | valorConsulta: " + plano.getValorConsulta());
		}
		System.out.println(getListaPlanos().size());
		
		
		stmt.close();
	}
	
	/**
	 * Metodo que recebe uma pequisa em banco de dados
	 * e retorna uma lista dos planos de saude
	 * @param ResultSet rs
	 * @return List<PlanoDeSaude>
	 * @throws SQLException
	 */
	public List<PlanoDeSaude> convertePesquisaEmLista(ResultSet rs) throws SQLException{
		List<PlanoDeSaude> listaPlanos = new ArrayList<PlanoDeSaude>();
		PlanoDeSaude planoTemp = null;
		while (rs.next()) {
		
			try {
				planoTemp = new PlanoDeSaude(rs.getInt("codigoPlano"));
				planoTemp.setNomeDoPlano(rs.getString("nomePlano"));
				planoTemp.setTelefoneContato(rs.getString("telefonePlano"));
				planoTemp.setValorRetorno(rs.getDouble("valorRetorno"));
				planoTemp.setValorConsulta(rs.getDouble("valorConsulta"));
				
				if (!listaPlanos.contains(planoTemp)){
					listaPlanos.add(planoTemp);
				}
				
			} catch (Exception e) {				
				e.printStackTrace();
			}			
						
		}
		rs.close();
		return listaPlanos;
	}
	/**
	 * Metodo que atualiza um dado plano modificando seu nome.
	 * @param String nome
	 * @param String novoNome
	 * @throws SQLException
	 */
	public void update(String nome, String novoNome) throws SQLException {
		
		String sql = "update PlanoDeSaude set nomePlano=(?) where nomePlano=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, novoNome);
		stmt.setString(2, nome);
		
		stmt.execute();
		stmt.close();
		
	}
	
	/**
	 * Metodo que atualiza os dados de um dado plano de saude.
	 * @param PlanoDeSaude plano de saude
	 * @throws SQLException
	 */
	public void editaPlano(int codigoAnterior, PlanoDeSaude plano) throws SQLException {		
		String sql = "update PlanoDeSaude set codigoPlano=?, nomePlano=?," +
				"telefonePlano=?, valorRetorno=?, valorConsulta=? where codigoPlano=?";
		
		PreparedStatement stmt = conexao.prepareStatement(sql);
		stmt.setInt(1, plano.getCodigo());
		stmt.setString(2, plano.getNomeDoPlano());
		stmt.setString(3, plano.getTelefoneContato());
		stmt.setDouble(4, plano.getValorRetorno());
		stmt.setDouble(5, plano.getValorConsulta());		
		stmt.setInt(6, codigoAnterior);
		stmt.executeUpdate();		
		
	}	
	
	/**
	 * Metodo que deleta um plano de saude do banco de dados.
	 * @param Integer codigo do plano
	 * @throws SQLException
	 */
	public void delete(int codigo) throws SQLException {
		String sql = "delete from PlanoDeSaude where codigoPlano=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setInt(1, codigo);
				
		stmt.execute();
		stmt.close();		
	}
	
	/**
	 * metodo para deletar todas as informacoes do
	 * da tabela plano de saude no BD
	 * @throws SQLException
	 */
	public void deleteAll() throws SQLException {
		String sql = "delete from PlanoDeSaude";
		PreparedStatement stmt = conexao.prepareStatement(sql);
		stmt.execute();
		stmt.close();			
	}
	
	/**
	 * Metodo que retorna uma sugestao de codigo 
	 * para o plano de saude
	 * @return int codigoPlano
	 * @throws SQLException
	 */
	public int codigoMarcar() throws SQLException{
		if(getListaPlanos().size() > 0){
			PreparedStatement stmt = conexao.prepareStatement("select max(codigoPlano) from PlanoDeSaude");
			ResultSet rs = stmt.executeQuery();
			if (rs.next())
				return rs.getInt(1) + 1;
		}
		
		return 0;
	}
	/**
	 * Metodo acessador que retorna a lista dos planos existentes
	 * no banco.
	 * @return List<PlanoDeSaude> lista contendo todos os planos
	 * adicionados no BD.
	 * @throws SQLException 
	 */
	public List<PlanoDeSaude> getListaPlanos() throws SQLException {
		
		
		PreparedStatement stmt = conexao.prepareStatement("select * from PlanoDeSaude ORDER BY nomePlano");
		ResultSet rs = stmt.executeQuery();
		
		return convertePesquisaEmLista(rs);
	}	
	

}
